package d_builder;

public class Computer {
    private String cpu ; //必选
    private String ram;  // 必选
    private String keyboard ; // 可选择
    private String display ; // 可选
    private  String test ; // 可选

    private Computer(Builder builder){
        this.cpu = builder.cpu ;
        this.ram = builder.ram ;
        this.keyboard = builder.keyboard ;
        this.display = builder.display ;
    }



    /**
     * 静态内部类只可以访问外部类中的静态成员变量与成员方法
     * 非静态的内部类即可以访问静态的也可以访问非静态的外部类成员方法与成员变量
     */
    public static class Builder{
        private String cpu ; //必选
        private String ram;  // 必选
        private String keyboard ; // 可选择
        private String display ; // 可选

        public  Builder(String cpu,String ram){
            this.cpu = cpu ;
            this.ram = ram ;
        }

        public  Builder setKeyboard(String keyboard){
            this.keyboard = keyboard ;
            return this;
        }

        public Builder setDisplay(String display){
            this.display = display ;
            return this;
        }

        public Computer build(){
            return  new Computer(this);
        }
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", ram='" + ram + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", display='" + display + '\'' +
                '}';
    }


    /**
     *
     *
     * 1 编译器自动为内部类添加一个成员变量， 这个成员变量的类型和外部类的类型相同， 这个成员变量就是指向外部类对象的引用；
     *
     * 2 编译器自动为内部类的构造方法添加一个参数， 参数的类型是外部类的类型， 在构造方法内部使用这个参数为1中添加的成员变量赋值；
     *
     * 3 在调用内部类的构造函数初始化内部类对象时， 会默认传入外部类的引用。
     *
     *  ===> 内部类的创建依赖外部类
     */
}
